package com.kimari.demo;

/**
 * 算法练习七
 * 将一个正整数分解质因数。
 * 例如：输入90,打印出90=2*3*3*5。
 * 对n进行分解质因数，
 * 应先找到一个最小的质数k，
 * 然后按下述步骤完成：
 * a)如果这个质数恰等于n，则说明分解质因数的过程已经结束，打印出即可。
 * b)如果n不等于i，i能被n整除，则应打印出i的值，
 *   并用n除以i的商,作为新的正整数n,重复执行第一步。
 * @author Reimu
 */
public class Divide {
    /**
     * 确定一个常量来表示
     * 最小的质因数 2
     * 以免出现魔法值
     */
    private static final int MIN_FACTOR = 2;


    /**
     * @param num 需要分解的数字
     */
    public static void decomposeFactor(int num) {
        //质因数都是从 2 开始的
        int i = MIN_FACTOR;
        //用来保存字符串
        StringBuilder sb = new StringBuilder();
        //保存原始数字
        int origin = num;
        //辗转相除法
        while (i <= num) {
            //若 num 能整除 最小值 i 则 i 是 num 的一个质因数
            if (num % i == 0) {
                //链式调用
                sb.append(i).append("✖");
                //同时将 num 除以 i 的值赋值给 num
                num = num / i;
                //重新使 i 的值为 2
                i = MIN_FACTOR;
            } else {
                //若无法整除，则 i 自增
                i++;
            }
        }
        //去除字符串缓存中的最后一个 ✖ 号
        System.out.println(origin + "=" + sb.substring(0, sb.toString().length() - 1));
    }
}
